package offer;

public class offer_0019 {
    public boolean isMatch(String s, String p) {
        int lens=s.length();
        int lenp=p.length();
        boolean[][] dp=new boolean[lens+1][lenp+1];
        char[] lists=s.toCharArray();
        char[] listp=p.toCharArray();
        dp[0][0]=true;
        for(int j=0;j<lenp;++j){
            if(listp[j]=='*'&&dp[0][j-1]){
                dp[0][j+1]=true;
            }
        }
        for(int i=1;i<lens+1;++i){
            for(int j=1;j<lenp+1;++j){
                if(listp[j-1]=='*'){
                    if(listp[j-2]=='.'){
                        dp[i][j]=dp[i-1][j-1]||dp[i][j-1]||dp[i-1][j]||dp[i][j-2];
                    }
                    else if(lists[i-1]==listp[j-2]){
                        dp[i][j]=dp[i-1][j-1]||dp[i][j-1]||dp[i-1][j]||dp[i][j-2];
                    }
                    else{
                        dp[i][j]=dp[i][j-2];
                    }
                }
                else{
                    if(listp[j-1]=='.'){
                        dp[i][j]=dp[i-1][j-1];
                    }
                    else if(listp[j-1]==lists[i-1]){
                        dp[i][j]=dp[i-1][j-1];
                    }
                    else{
                        dp[i][j]=false;
                    }
                }
            }
        }
        return dp[lens][lenp];
    }
}
